package cn.diancan.dao;

import java.io.Serializable;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.List; 
import org.hibernate.SessionFactory;



/**
 * 基础数据库操作类
 */
public interface MyBaseDao<T> {


	public SessionFactory getSessionFactory() ;
	
	/**
	 * 保存一个对象 
	 * @param o
	 * @return
	 */
	public Serializable save(T o) ;
	
	public List findList(String hql);

	/**
	 * 删除一个对象
	 * 
	 * @param o
	 */
	public void delete(T o);


	/**
	 * 更新一个对象
	 * 
	 * @param o
	 */
	public void update(T o);

	/**
	 * 保存或更新对象
	 * 
	 * @param o
	 */
	public void saveOrUpdate(T o);
	
	/**
	 * 保存一个对象 ,使用Utf8mb4编码.使emoji能入库
	 * @param o
	 */
	public void saveUseUtf8Mb4(T o);
	/**
	 * 保存或更新对象,使用Utf8mb4编码.使emoji能入库
	 * @param o
	 */
	public void saveOrUpdateUseUtf8Mb4(T o);
	
	/**
	 * 更新对象,使用Utf8mb4编码.使emoji能入库
	 * @param o
	 */
	public void updateUtf8Mb4(T o);

	/**
	 * 查询
	 * 
	 * @param hql
	 * @return
	 */
	public List<T> find(String hql); 
	/**
	 * 查询集合
	 * 
	 * @param hql
	 * @param param
	 * @return
	 */
	public List<T> find(String hql, Object[] param);

	/**
	 * 查询集合
	 * 
	 * @param hql
	 * @param param
	 * @return
	 */
	public List<T> find(String hql, List<Object> param);

	/**
	 * 查询集合(带分页)
	 * 
	 * @param hql
	 * @param param
	 * @param page
	 *            查询第几页
	 * @param rows
	 *            每页显示几条记录
	 * @return
	 */
	public List<T> find(String hql, Object[] param, Integer page, Integer rows);

	/**
	 * 查询集合(带分页)
	 * 
	 * @param hql
	 * @param param
	 * @param page
	 * @param rows
	 * @return
	 */
	public List<T> find(String hql, List<Object> param, Integer page, Integer rows);
	
	public List<Object[]> findBySql(String hql) ;
	
	public List<Object[]> findSql(String hql,Object[] param, Integer page, Integer rows);
	
	public List<Object[]> findSql(String hql, List<Object> param, Integer page, Integer rows);
	

	/**
	 * 获得一个对象
	 * 
	 * @param c
	 *            对象类型
	 * @param id
	 * @return Object
	 */
	public T get(Class<T> c, Serializable id);

	/**
	 * 获得一个对象
	 * 
	 * @param hql
	 * @param param
	 * @return Object
	 */
	public T get(String hql, Object[] param);

	/**
	 * 获得一个对象
	 * 
	 * @param hql
	 * @param param
	 * @return
	 */
	public T get(String hql, List<Object> param);

	/**
	 * select count(*) from 类
	 * 
	 * @param hql
	 * @return
	 */
	public Long count(String hql);

	/**
	 * select count(*) from 类
	 * 
	 * @param hql
	 * @param param
	 * @return
	 */
	public Object countSQL(String hql,Object[] param);
	public Object countSQL3(String hql, List<Object> param) ;
	public Double countSQL1(String hql) ;
	public BigDecimal countSQL2(String hql);
	public Long count(String hql, Object[] param);

	/**
	 * select count(*) from 类
	 * 
	 * @param hql
	 * @param param
	 * @return
	 */
	public Long count(String hql, List<Object> param);
	
	public Double countToDouble(String hql, List<Object> param);

	/**
	 * 执行HQL语句
	 * 
	 * @param hql
	 * @return 响应数目
	 */
	public Integer executeHql(String hql);

	/**
	 * 执行HQL语句
	 * 
	 * @param hql
	 * @param param
	 * @return 响应数目
	 */
	public Integer executeHql(String hql, Object[] param);

	/**
	 * 执行HQL语句
	 * 
	 * @param hql
	 * @param param
	 * @return
	 */
	public Integer executeHql(String hql, List<Object> param);

	public Double count1(String hql6);

	public Integer count2(String hql);
	public Object count3(String hql);
	public Object count3(String hql, Object[] param);
	
	
	public List<T> find(String hql,  Integer page, Integer rows) ;

	/**
	 * 无返回结果
	 * @param hql
	 * @return
	 */
	public String find2(String hql);
	
	/**
	 * 支持完全的sql
	 * @param hql
	 * @param param
	 * @return
	 */
	public Integer executeSQLHql(String hql, List<Object> param);
	/**
	 * 支持完全的sql
	 * @param hql
	 * @param param
	 * @return
	 */
	public Integer executeSQLHql(String hql,Object[] param);
	
	/**
	 * 更新非空字段
	 * @param model
	 * @return
	 */
	public <T> int	updateIsNotNull(T model);

	public Integer executeHqlUseUtf8Mb4(String hql, Object[] param);

}
